package geekbang.single;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author xuyanqing
 * @description 唯一递增ID号码生成器（饿汉式 不支持延迟加载）
 * 构造函数需要是 private 访问权限的，这样才能避免外部通过 new 创建实例；
 * 考虑对象创建时的线程安全问题；
 * 考虑是否支持延迟加载；
 * 考虑 getInstance() 性能是否高（是否加锁）。
 * @date 2025-10-11 9:48
 * @creed where there is a will,there is a way. yx
 */

public class IdGeneratorHungry {

    /**
     * 在类加载的时候，instance 静态实例就已经创建并初始化好。
     * 所以，instance 实例的创建过程是线程安全的。
     * 不过，这样的实现方式不支持延迟加载（在真正用到 IdGeneratorHungry 的时候，再创建实例）
     */
    private static final IdGeneratorHungry instance = new IdGeneratorHungry();
    private IdGeneratorHungry(){}

    public static IdGeneratorHungry getInstance(){
        return instance;
    }

    private AtomicInteger id = new AtomicInteger(0);

    public long getId(){
        return id.incrementAndGet();
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(()-> System.out.println(IdGeneratorHungry.getInstance().getId())).start();
        }
    }
}
